--	 实验书例题

-- 实验 1.5 查看数据库层面的存储结构信息
-- (1) 查询数据库服务器的概要情况
select *
from sys.servers
where server_id=0
-- (2) 查询各个数据库的详细信息
select *
from sys.databases
-- (3) 查询文件组的详细信息
select *
from sys.filegroups
-- (4) 查询各个数据库文件的详细信息
select *
from sys.master_files
-- (5) 查询当前数据库文件的详细信息
select *
from sys.database_files
-- (6) 查询数据空间的详细情况,可以是文件组或者分区方案
select *
from sys.data_spaces

-- 实验 1.6 查看数据库中书库表的存储信息
create table test
(
	id int not null,
	name char(100) null,
	constraint pk_test primary key clustered (id asc)
)
create nonclustered index ix_test on test(name)
-- (1) 由于几乎所有的用户对象信息都出自于sys.objetcts表,根据表名称可以查询出test表的相关信息
select *
from sys.objects
where type_desc='user_table' and name='test'
-- (2) 查询与test白哦相关的所有对象
select *
from sys.objects
where type_desc='user_table' and name='test' or parent_object_id in 
(select object_id
	from sys.objects
	where type_desc='user_table' and name='test')
-- (3) 查询test表的字段详细信息,并查询出相关column_id的信息
select *
from sys.columns
where object_id='1483152329'
-- (4) 查询test表中的索引文件信息,可以清楚滴看到存在两个索引
select *
from sys.indexes
where object_id='1483152329'
-- (5) 查询test表的分区信息
select *
from sys.partitions
where object_id='1483152329'
select *
from sys.allocation_units
-- (6) sys.allocation_units和sys.partitions一起使用能够反映出某个对象的页面分配和使用情况
	select *
	from sys.allocation_units u, sys.partitions p
	where u.type in (1,3) and u.container_id=p.hobt_id and p.object_id='1483152329'
union all
	select *
	from sys.allocation_units u, sys.partitions p
	where u.type =2 and u.container_id=p.partition_id and p.object_id='1483152329'
-- (7) 查询每个分区的页和行计数信息
select *
from sys.dm_db_partition_stats
where object_id='1483152329'
-- (8) 查询索引的详细字段情况
select *
from sys.index_columns
where object_id='1483152329'
-- (9) 查询数据库用户表
select *
from sys.database_principals
-- (10) 查询数据库数据类型表
select *
from sys.types


-- 实验 2.2 使用t-sql语句创建学籍管理数据库,其数据库名为educ,初识大小为10mb,最大为50mbmb,数据库自动增长,
-- 增长方式是按5%的比例增长,日志文件初始为2mb,最大可增长到10mb,按1mb的增量增长.数据库的逻辑文件名为student_data、物
-- 理文什名为student_data.mdf,存放路径为“d:\sql_data.日志文件的逻辑文件名为student_log、物理文件名为student_log.ldf,存放路径为“d:\sql_data”
create database educ
      on primary
(
name=student_data,
      filename='d:\sql_data\student_data.mdf',
      size=10mb,
      maxsize=50mb,
      filegrowth=5%
    )
log on
   (
name=student_log,
      filename='d:\sql_data\student_log.ldf',
      size=2mb,
      maxsize=10mb,
      filegrowth=1mb
)

-- 实验 2.4 使用目录视图、系统函数和系统存储过程等查看有关数据库的基本信息
-- 1.通过目录视图sys.databases查看数据库的属性
use educ
go
select database_id, is_read_only, collation_name, compatibility_level
from sys.databases
where name = 'educ'
go
-- 2.使用系统函数databasepropertyex查看数据库的属性
use educ;
go
select databasepropertyex('educ', 'isautoshrink')
go
-- 3.使用系统函数objectproperty查看当前数据库中所有用户表的名称
use jxgl
go
select object_name(id) as '数据表名'
from sysobjects
where xtype='u' and objectproperty(id,'ismsshipped')=0
go
-- 4.使用系统存储过程sp_spaceused查看educ数据库的空间信息
use educ
go
exec sp_spaceused 
go

-- 实验 2.5 修改数据库的相关属性
-- 1.在数据库jxgl中增加辅助数据文件xs_data,需要在数据库引擎查询文档中输入以下代码
use jxgl
go
alter database jxgl
    add  file
   ( 
      name=xs_data,
filename='d:\jxglsys\xs_data.ndf',
      size=3mb,
      maxsize=10mb
 )
go
-- 2.增加辅助日志文件,在数据库jxgl中增加事务日志文件xs_log,在数据库引擎查询文档中输入以下代码
use jxgl
go
alter database jxgl
add log file
    ( 
      name=xs_log,
      filename='d:\jxglsys\xs_log.ldf',
      filegrowth=10% 
    )
go
-- 3.修改数据库文件.修改数据库jxgl中的日志文件的初始大小和最大值,在实验2.1中添加的日志文件xs_log的初始大小为1mbmb,增长的最大限制为2097152mbmb.下面修改其
-- 初始大小为3mbmb、增长的最大限制为5mbmb.在数据库引擎查询文档中输入以下代码
use jxgl
go
alter database jxgl
modify file
   ( 
     name=xs_log,
     size=3,
     maxsize=5 
)
go
-- 4. 删除日志文件.删除xsgl数据库中的xs_log日志文件,需要在数据库查询引擎文档中输入以下代码
use jxgl
go
alter database jxgl
remove file xs_log
go


-- 实验 3.2 在学生管理数据库educ中利用t-sql语句创建数据表,表结构如书所示
-- 1.创建院系信息表dept_info的代码
use educ
go
create table dept_info
(
	dno char(4) primary key ,
	dname char(16) not null,
	d_chair char(8),
	d_address varchar(50),
	tel char(12)
)
go
-- 2.创建班级信息表class_info的代码
use educ
go
create table class_info
(
	classno char(4) primary key ,
	classname char(16) not null,
	monitor char(8),
	instructor char(8),
	tel char(12),
	dno char(4),
	foreign key (dno) references dept_info(dno)
)
go
-- 3.创建学生信息表student_info的代码
use educ
go
create table student_info
(
	sno char(8) primary key ,
	sname char(8) not null,
	sex char(2),
	s_native varchar(50),
	birthday smalldatetime,
	dno char(4),
	classno char(4),
	entime smalldatetime,
	home varchar(50),
	tel char(12),
	foreign key (dno) references dept_info(dno),
	foreign key (classno) references class_info(classno)
)
go

-- 实验 3.3 使用t-sql语句向数据表中插入和更新数据
-- 1.向标中插入记录's13','吕淑霞',19,'女','cs',则在数据库引擎查询文档中输入以下代码
use jxgl
go
insert into s
	(sno,sname,age,sex,sdept)
values('s13', '吕淑霞', 19, '女', 'cs')
go
-- 2.吕淑霞同学选修了电子商务这门课,期末的考试成绩为95分,sql语句如下
use jxgl
go
insert into sc
	(sno,cno,grade)
values('s13', 'c10', 95)
go
use jxgl
go
insert into sc
	(sno,cno)
values('s13', 'c9')
go
-- 3.修改吕淑霞同学电子商务的成绩为90
use jxgl
go
update sc set grade=90 
where sno='s13' and cno='c10'
go
-- 4.在表sc中删除学号为’s13’和课号’c10’的记录。
use jxgl
go
delete from sc where sno='s13' and cno='c10'
go

-- 实验 3.4 修改数据表结构
-- 1.为学生表s中的年龄字段age增加约束,限制年龄在15—~30岁之间(包括15岁和30岁)
use jxgl
go
alter table s 
add constraint con_age check(age>=15 and age<=30)
go
-- 2.在学生表s中增加班级字段class为可变字符串类型varchar,长度为20 
use jxgl
go
alter table s add class varchar(20)
go
-- 3.修改学生表s中的class字段的长度为50
use jxgl
go
alter table s alter column class varchar(50)
go
-- 4.删除学生表s中的class字段
use jxgl
go
alter table s drop column class 
go

-- 实验 3.5 查看数据表的相关信息
-- 1.查询表s的结构信息
use jxgl
go
exec sp_help s
go
-- 2.查看指定表s的空间大小等信息
use jxgl
go
exec sp_spaceused 's'
go
-- 3.查看所有用户表的空间大小等信息
use jxgl
go
exec sp_msforeachtable "exec sp_spaceused '?'" 
go
-- 4.查看表s的文件号和对应页好以及页面类型等信息
use jxgl
go
exec ('dbcc ind(jxgl,s,1)'  );
go


-- 实验 4.1 主键的设置和管理
-- 1.如在教学管理数据库jxgl中创建学生表s时同时定义主键
create table s
(
	sno char(9) primary key,
	sname char(8),
	sex char(2),
	age smallint,
	sdept varchar(50)
)
-- 2.如果定义数据库表时s没有定义sno为主键,则需要添加主键
alter table s
add
constraint pk_sno primary key clustered(sno)

-- 实验 4.2  sql自增字段int identity
-- 1.可以用int identity(1,1)类型定义自增列
use jxgl
go
create table s
(
	sno int identity(1,1),
	sname char(8),
	sex char(2),
	age smallint,
	sdept varchar(50)
)
-- 2.用selectselect查询时增加列
use jxgl
go
select identity(int,1,1) as #id, *
into #tmp
from s
select *
from #tmp
go
-- 该例定义了一个自增列“#id“.而@@identity表示最近一次具有identity属性的表对应自增列的值
use jxgl
go
select @@identity
go

-- 实验 4.3 唯一性约束的设置与删除
create table s
(
	sno char(9) not null primary key,
	sname char(8) not null constraint s_sno unique,
	sex char(2),
	age smallint,
	sdept varchar(50)
)

-- 实验 4.4 创建和管理检查约束
use jxgl
go
create table s
(
	sno char(9) not null primary key,
	sname char(8) not null constraint s_sno unique,
	sex char(2),
	age smallint check(age>=15 and age<=30),
	sdept varchar(50)
)
go
use jxgl
go
create table s
(
	sno char(9) not null primary key,
	sname char(8) not null constraint s_sno unique,
	sex char(2),
	age smallint constraint ck_s_age check(age>=15 and age<=30),
	sdept varchar(50)
)
go
use jxgl
go
create table s
(
	sno char(9) not null primary key,
	sname char(8) not null constraint s_sno unique,
	sex char(2),
	age smallint,
	sdept varchar(50),
	check(age>=15 and age<=30)
)
go
-- 2.在现有表上创建检查约束
use jxgl
go
alter table s
with nocheck add constraint ck_s_dept
check(sdept in('cs','ma','is'))
go
use jxgl
go
alter table s
with nocheck add constraint ck_s_dept
check(sdept in('cs','ma','is')),
constraint ck_age check(age>=15 and age<=30)  
go
-- 3.创建多列约束
use jxgl
go
alter table s with nocheck
add constraint ck_s_age_sdept
check(sdept in('cs','ma','is') and age>=15 and age<=30)
go
use jxgl
go
alter table s with nocheck
add constraint ck_s_age_dept
check((sdept='cs' and sdept>=15)or
(sdept='ma' and sdept<=30) or
(sdept='is'))
go

-- 实验 4.5 外艰的定义和管理
-- 1.在定义数据表时定义外键
use jxgl
go
create table sc
(
	sno char(9) not null,
	cno char(4) not null,
	grade real null,
	primary key(sno,cno),
	foreign key(sno) references s(sno),
	foreign key(cno) references c(cno)
)
go
-- 如果在定义表sc时没有定义外键,可以增加表sc的外键约束fk_s_sno,表sc中的sno受表s中的sqlsql server主键sno约束
use jxgl
go
begin transaction
alter table sc add constraint fk_s_sno
foreign key(sno) 
references s(sno)
commit transaction
go
-- 3.参照完整性测试
use jxgl
insert into sc
value('s8','c4'
).
-- 可以插入
insert into sc
value('s9','c4'
).
-- 可以插入
insert into sc
value('s100','c4'
).
-- 错误,无法插入,学号s100在s表中不存在
-- 4.当外键没有用时就可以删除它,如删除sc的外键fk_s_sno
use jxgl
go
begin transaction
alter table sc drop constraint fk_s_sno
commit
go

-- 实验 4.6 默认值约束的设置与删除
-- 1.创建表时的制定默认值
use jxgl
go
create table s
(
	sex char(2) default ’男’
)  
go
-- 2.创建表时指定默认值,并制定约束名
use jxgl
go
create table s
(
	sex char(2) constraint s_sex_defa default ’男’
)  
go
-- 3.创建表时没有指定默认值,并指定约束名称
use jxgl
go
alter table s add default ’男’ for sex 
go
-- 4.通过sql语句添加默认值
use jxgl
go
alter table s add constraint s_sex_defa default ’男’ for sex 
go
-- 5.删除默认值约束
use jxgl
go
alter table s drop constraint s_sex_defa
go


-- 实验 6.1 在jxgl数据库的s表中定义一个包含sno sname age sex sdept 的只读游标，游标名称为cs_cursor,并将游标中的数据逐条显示出来 
use jxgl
go
declare cs_cursor scroll cursor
for
select sno, sname, age, sex, sdept
from s
for
read
only
open cs_cursor
fetch from cs_cursor
go

-- 实验 6.2 在s表中定义一个所在系cs且包含 sno sname sex age sdept 项的游标名称，名称为cs_cursor
use jxgl
go
declare cs_cursor scroll cursor
for
select sno, sname, sex, age, sdept
from s
where sdept='cs'
open cs_cursor
fetch first from cs_cursor
go
fetch last from cs_cursor
fetch prior from cs_cursor
fetch absolute 2 from cs_cursor
close cs_cursor
deallocate cs_cursor

-- 实验 6.3 在s表中定义一个游标，将查询出的姓名值传送给变量
use jwgl
go
declare @s_sname char(8)
declare cs_cur scroll cursor
for
select sname
from s
for
read
only
open cs_cur
fetch from cs_cur into @s_sname
print '查询到的学生姓名是:'+ @s_sname
go

-- 实验 6.4 在s表中定义一个所在系部为cs且包含sno sname sex 的游标，游标名称为cs_cursor,将游标绝对位置为2的学生的姓名改为‘王南’，性别为‘女’
use jxgl
go
declare cs_cursor scroll cursor
for
select sno, sname, sex
from s
where sdept='cs'
for
update
of
sname,sex
open cs_cursor
fetch absolute 2 from cs_cursor
update s
    set sname='王南',sex='女'
    where current of cs_cursor
fetch absolute 2 from cs_cursor
go

-- 实验 6.5在s表中定义一个包含学号，姓名，性别的游标，游标名称为cs_cursor,将游标的绝对位置为2的学生数据删除
use jxgl
go
declare cs_cursor scroll cursor
for 
select sno, sname, sex
from s
open cs_cursor
fetch absolute 2 from cs_cursor
delete from s where current of cs_cursor
go

-- 实验 6.6 在s和sc表中定义一个包含学号，姓名和成绩的游标，游标的名称为sc_cursor,将游标遍历整个数据表，经常使用系统变量@@fetch_status来控制while循环中的游标活动
use jxgl
go
declare cs_cursor scroll cursor
for 
select s.sno, sname, grade
from s, sc
where s.sno=sc.sno
open cs_cursor
declare @no char(9)
declare @name char(8)
declare @grad int
fetch next from cs_cursor into @no,@name,@grad
while @@fetch_status=0
begin
	print @no+'   '+@name+'   '+str(@grad)
	fetch next from cs_cursor into @no,@name,@grad
end
close cs_cursor
deallocate cs_cursor
go

-- 实验 6.7 利用游标在串行状态下执行用户数据文件备份
use master
go
declare @name varchar(50)
declare @path varchar(256)
declare @filename varchar(256)
declare @filedate varchar(20)
set @path='d:\jxgl'
select @filedate=convert(varchar(20),getdate(),112)
declare db_cursor cursor for
select name
from master.dbo.sysdatabases
where name not in('master','model','msdb','tempdb')
open db_cursor
fetch next from db_cursor into @name
while @@fetch_status=0
begin
	set @filename=@path+@name+'_'+@filedate+'.bak'
	backup database @name to disk=@filename
	fetch next from db_cursor into @name
end
close db_cursor
deallocate db_cursor
go


-- 实验 7.1 创建名为s_grade的存储过程，要求查询jxgl数据库中的每个学生各门功课的成绩，其中包含每个学生的sno ,sname,cname,grade
use jxgl
go
create procedure s_grade
as
select s.sno, sname, cname, grade
from s join sc on s.sno=sc.sno join c on sc.cno=c.cno
go
use jxgl
go
exec s_grade
go

-- 实验 7.2 创建名为proc_exp的存储过程，要求输入某学生的姓名是从sc表中查询该学生的平均成绩
use jxgl
go
if exists (select name
from sysobjects
where name='proc_exp' and type='p')
   drop procedure proc_exp
go
create procedure proc_exp
	@s_name char(20)
as
select avg(grade) as '平均成绩'
from s join sc on s.sno=sc.sno and sname=@s_name
go
use jxgl
go
exec proc_exp '姜芸'
go

-- 实验 7.3 创建名为s_info的存储过程，要求输入某学生的姓名是输出该学生所学的课程门数以及他的平均成绩
use jxgl
go
create procedure s_info
	@s_name char(8)
as
declare @s_count int
declare @s_avg real
select @s_count=count(cno), @s_avg=avg(grade)
from s join sc on s.sno=sc.sno and sname=@s_name
print @s_name+'同学的平共选修了'+str(@s_count)+'门课程。平均成绩为：'+str(@s_avg)
go
use jxgl
go
exec s_info '吴玉江'
go

-- 实验 7.4 创建存储过程proc_insert_sno,实现数据的插入操作
use jxgl
go
create procedure proc__insert_sno
	@s_no char(8),
	@s_name char(8)
as
begin
	declare @count  int
	set @count = (select count(*)
	from s
	where sno = @s_no)
	if (@count>0)    
      begin
		delete from s where sno = @s_no
		insert into s
			(sno,sname)
		values
			(@s_no, @s_name)
	end    
     else    
      insert into  s
		(sno,sname)
	values
		(@s_no, @s_name)
end
go
use jxgl
go
execute proc__insert_sno 's30','王伟'
go

-- 实验 7.5 设计数据库jxgl中有用户表users(username char(20),passworo char(6)),创建存储过程user_pwd,实现用户验证功能。
create procedure user_pwd
	@users char(8),
	@pwd char(20),
	@legal bit output
as
if exists(select *
from users
where username = @users and password= @pwd) 
set @legal = 1 
else 
set @legal = 0
declare @ren bit
exec user_pwd '马三强','54321',@ren output
if @ren=1 
   print '用户名和密码正确'
else
   print '用户名或密码不正确'

-- 实验 7.6创建储存过程table_info,查看数据表的索引信息
use jxgl
go
create proc table_info
	@table varchar(30)
as
select table_name = sysobjects.name,
	index_name = sysindexes.name, index_id = indid
from sysindexes inner join sysobjects on sysobjects.id = sysindexes.id
where sysobjects.name = @table
go
use jxgl
go
exec table_info 's'
go

-- 实验 7.7 修改存储过程proc exp ,要求输入学生学号时根据该学生所选课程的平均 成绩显示提示信息,即如果平均成绩在60分以上,显示“此学生综合成绩合格,成绩为×× 分”,否则显示“此学生综合成绩不合格,成绩为××分”。

use jxgl
go
alter procedure proc_exp
	@s_name char(20)
as
declare @savg int 
select @savg=avg(grade)
from s join sc on s.sno=sc.sno and s.sname=@s_name
if @savg>60 
       print '此学生综合成绩合格，成绩为'+convert(char(2),@savg)+'分'
else
       print '此学生综合成绩不合格，成绩为'+convert(char(2),@savg)+'分'
go
use jxgl
go
exec proc_exp '吴玉江'
go

-- 实验 7.8删除储存过程proc_exp和储存过程proc_add 
use jxgl
go
drop procedure proc_exp
drop procedure proc_add
go


-- 实验 8.1 创建jxgl数据表s的插入触发器tri_insert_s,插入记录的年龄仅在15-30
use jxgl
go
create  trigger tri_insert_s on s
for insert
as
declare @s_age tinyint
select @s_age=s.age
from s
if @s_age not between 15 and 30
       rollback  transaction
go
use jxgl
go
insert into s
values('s15', '王晓杰', 'f', 21, 'ma')
insert into s
values('s16', '邵庆国', 'm', 13, 'is')
go

-- 实验 8.2 创建jxgl数据表s的一个delete触发器tgr_s_delete,当删除s表中的记录是触发该触发器
use jxgl
go
--delete删除类型触发器
create trigger tgr_s_delete
on s
      for delete  --删除触发
as
      print '备份数据中……'    
      if (object_id('s_backup','u') is not null)
         --存在s_backup，直接插入数据
        insert into s_backup
select sno, sname
from deleted
      else
         --不存在s_backup创建再插入
        select *
into s_backup
from deleted
        print '备份数据成功！'
go
use jxgl
go
delete s where sno = 's14'
--查询数据
select *
from s
select *
from s_backup
go
select object_id
from sys.triggers
where name = 'databasetriggerlog'
use master
go
select object_id('adventureworks2012.production.workorder') 
as 'object id';
go
use master
go
if object_id ('dbo.awbuildversion','u') is not null
drop table dbo.awbuildversion
go
use master
go
declare @db_id int
declare @object_id int
set @db_id = db_id('adventureworks2008')
set @object_id = object_id('adventureworks2008.person.address')
if @db_id is null 
    print n'invalid database'
else if @object_id is null
               print n'invalid object'
          else
               select *
from sys.dm_db_index_operational_stats(@db_id, @object_id,null,null)
go

-- 实验 8.3 在数据库jxgl中3个表，s,sc和c，表sc的字段sno作为外键与表s链接，如果删除s中记录需要创建触发器，先删除sc中与要记录级联的全部记录，在删除s表中的记录
use jxgl
go
create trigger delete_sc_s on s 
instead of  delete 
as
declare @s_no char(9)   
select @s_no=sno
from deleted
delete from sc
where sno=@s_no
delete from s
where sno=@s_no
go
use jxgl
go
delete s where sno='s13'
go

-- 实验 8.4  在教学管理数据库jxgl中，在删除s表中的元组时将删除的这个元祖的前两个属性值插入到bian_s表中
create trigger tr_s_delete
on s
for delete   
as
declare @s_no char(8),@s_name char(4)
select @s_no=sno, @s_name=sname
from deleted
insert into  ban_s
values(@s_no, @s_name)
go
delete from s where sno='s30'
delete from s where sno='s22'

-- 实验 8.5 为学生s创建一个update触发器，当更新某同学的姓名时激活该触发器，并使用print语句返回一个提示信息
use jxgl
go
create trigger tgr_s_update
on s
for update
as
    declare @oldname char(8),@newname char(8)
    --更新前的数据
    select @oldname = sname
from deleted
    if (exists (select *
from s
where sname like '%'+ @oldname + '%'))
      begin
	--更新后的数据
	select @newname = sname
	from inserted
	update s set sname = replace(sname, @oldname, @newname) where sname like '%'+ @oldname + '%'
	print '级联修改数据成功！'
end
    else
       print '无需修改s表！'
go
use jxgl
go
select *
from s
order by sno
select *
from s
update s set sname = '王楠' where sname = '王南'
go

-- 实验 8.6 创建图书销售数据库tsxs,并创建如下两个数据表
if exists (select name
from sysobjects
where xtype = ’tr’ and name = ’t_sales’)
drop trigger t_sales 
go
create trigger t_sales 
on 图书销售表 
for insert 
as 
begin transaction 
--检查数据的合法性。销售的图书是否有库存，或者库存是否大于零。 
if not exists ( 
select 库存数量
from 图书库存表
where 图书编号 in (select 图书编号
from inserted)) 
begin
	--返回错误提示 
	raiserror(’错误！该图书不存在库存，不能销售。’,16,1)
	--回滚事务 
	rollback
	return
end 
if exists ( 
select 库存数量
from 图书库存表
where 图书编号 in (select 图书编号
	from inserted) and 库存数量<=0) 
begin
	--返回错误提示 
	raiserror(’错误！该图书库存小于等于0，不能销售。’,16,1)
	--回滚事务
	rollback
	return
end
--对合法的数据进行处理 
--强制执行下列语句，保证业务规则 
update 图书销售表 
set 销售金额 = 销售数量 * 销售单价 
where 图书编号 in (select 图书编号
from inserted) 
declare @图书编号 varchar(20) 
set @图书编号 = (select 图书编号
from inserted) 
declare @销售数量 money 
set @销售数量 = (select 销售数量
from inserted) 
update 图书库存表 
set 库存数量 = 库存数量 - @销售数量, 
库存金额 = (库存数量 - @销售数量)*库存单价 
where 图书编号 = @图书编号 
commit transaction 
go
insert into 图书销售表
	(图书编号,图书名称,销售数量,销售单价,销售金额)
select ‘jsj_
qh_s120023’,’数据库原理及应用’,10,12,1200 
go
insert into 图书销售表
	(图书编号,图书名称,销售数量,销售单价,销售金额)
select ’jsj_qh_s120023
’,’数据库原理及应用’,10,22,2000 
go
insert into 图书销售表
	(图书编号,图书名称,销售数量,销售单价,销售金额)
select ’jsj_gj_c203934
’,’操作系统’,10,60,600 
go
insert into 图书销售表
	(图书编号,图书名称,销售数量,销售单价,销售金额)
select ’jsj_qh_w403011
’,’物联网实用技术’,10,30,300 
go

-- 实验 8.7 触发器中的其他操作
use jxgl
go
create trigger tgr_message
on s
    after insert,update
    as raiserror('tgr_message触发器被触发',16,10)
go
use jxgl
go
update s set sex = 18 where sname ='张晓梅'
select *
from s
order by sno
disable trigger tgr_message
on s
enable trigger tgr_message on s
select *
from sys.triggers
select *
from sys.objects
where type = 'tr'
use jxgl
go
select te.*
from sys.trigger_events te join sys.triggers t
	on t.object_id = te.object_id
where t.parent_class = 0 and t.name = 'tgr_valid_data'
go
use jxgl
go
exec sp_helptext 'delete_s'
go


-- 实验 9.2使用t-sql语句创建与使用视图
use jwgl
if exists(select name
from sysobjects
where name='view_s_grade' and xtype='v') 
drop view view_s_grade
go
create view view_s_grade
as
	select s.sno, sname, sdept
	from s join sc on s.sno=sc.sno join c on sc.cno=c.cno
	where c.cname='数据结构' and sc.grade>80 
go
select *
from view_s_grade

-- 实验 9.3 使用sql server management studio 直接修改视图
use jxgl
go
alter view view_s_grade
as
	select s.sno, sname, sdept
	from s join sc on s.sno=sc.sno join c on sc.cno=c.cno
	where c.cname='数据结构'

-- 实验 9.4  使用sql server management studio 直接删除视图
use jxgl
go
drop view view_s_grade
go

-- 实验 9.6 使用t-sql语句创建索引文件
use jxgl
go
create index ix_sdept on s(sdept)
go
use jxgl
go
create index ix_age on s(age desc) 
go

-- 实验 9.8 使用t-sql语句删除主键（索引）
use jxgl
go
drop index s.i_sname
go
use jxgl
go
exec sp_helpindex s
go

